Quality Control

Author

Jialei Duan

Published

Wed Sep 21, 2022 20:08:14-05:00

Doi


[1] "2022-09-21 20:08:06 CDT"
[1] "America/Chicago"

Preparation

PROJECT_DIR <- file.path(
    "/Users/jialei/Dropbox/Data/Projects/UTSW",
    "/Cardiomyopathy/atac-seq"
)

Functions

Load required packages.

library(tidyverse)
## ── Attaching packages ────────────────────────────────── tidyverse 1.3.2.9000 ──
## ✔ ggplot2   3.3.6.9000        ✔ dplyr     1.0.99.9000  
## ✔ tibble    3.1.8.9001        ✔ stringr   1.4.1.9000   
## ✔ tidyr     1.2.1.9000        ✔ forcats   0.5.2.9000   
## ✔ readr     2.1.2.9000        ✔ lubridate 1.8.0.9000   
## ✔ purrr     0.9000.0.9000     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(Matrix)
## 
## Attaching package: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
library(patchwork)
library(extrafont)
## Registering fonts with R
source(
    file = file.path(
        SCRIPT_DIR,
        "utilities.R"
    )
)
`%+replace%` <- ggplot2::`%+replace%`

Python env

np <- reticulate::import("numpy", convert = TRUE)
cat("numpy version:", np$`__version__`, "\n")
numpy version: 1.22.4 
reticulate::py_config()
python:         /Users/jialei/.pyenv/shims/python
libpython:      /Users/jialei/.pyenv/versions/mambaforge-4.10.3-10/lib/libpython3.9.dylib
pythonhome:     /Users/jialei/.pyenv/versions/mambaforge-4.10.3-10:/Users/jialei/.pyenv/versions/mambaforge-4.10.3-10
version:        3.9.13 | packaged by conda-forge | (main, May 27 2022, 17:00:33)  [Clang 13.0.1 ]
numpy:          /Users/jialei/.pyenv/versions/mambaforge-4.10.3-10/lib/python3.9/site-packages/numpy
numpy_version:  1.22.4
numpy:          /Users/jialei/.pyenv/versions/mambaforge-4.10.3-10/lib/python3.9/site-packages/numpy

NOTE: Python version was forced by RETICULATE_PYTHON

QC

TSS enrichment score

Code
fs::dir_ls(
    path = file.path(
        PROJECT_DIR,
        "qc",
        "tss_enrichment/raw/core_set_merged",
        "cut_site"
    ),
    regexp = "npy$"
) |>
    purrr::map(\(x) {
        np$load(file = x) |>
            {
                \(y) {
                    y / mean(c(y[1:100], y[4102:4201]))
                }
            }() |>
            tibble::enframe(name = "position", value = "score") |>
            dplyr::mutate(
                category = x |>
                    basename() |>
                    stringr::str_remove(
                        pattern = "Aligned_sorted_deduped_q10_"
                    ) |>
                    stringr::str_remove(
                        pattern = "_21_tss_flanking_0.npy"
                    )
            )
    }) |>
    dplyr::bind_rows() |>
    dplyr::mutate(
        category = category |> stringr::str_to_title(),
        category = dplyr::case_when(
            category == "Fresh_healthy" ~ "Healthy",
            category == "Fresh_icm" ~ "ICM",
            category == "Fresh_nicm" ~ "NICM",
            category == "Fresh_hcm" ~ "HCM"
        ),
        category = factor(
            category,
            levels = c("Healthy", "ICM", "NICM", "HCM")
        )
    ) |>
    ggplot2::ggplot(
        ggplot2::aes(
            x = position,
            y = score,
            color = category
        )
    ) +
    ggplot2::geom_line(size = 0.5) +
    ggplot2::scale_x_continuous(
        name = "Distance from TSS (bp)",
        breaks = c(101, 1101, 2101, 3101, 4100),
        labels = seq(-2000, 2000, 1000)
    ) +
    ggplot2::scale_y_continuous(
        name = "Normalized cut sites"
    ) +
    ggplot2::scale_color_manual(
        name = NULL,
        values = as.character(yarrr::piratepal(palette = "google"))
    ) +
    ggplot2::ggtitle(label = "TSS enrichment score") +
    ggplot2::theme_linedraw(base_size = 6, base_family = "Arial") +
    ggplot2::theme(
        legend.background = ggplot2::element_blank(),
        legend.margin = ggplot2::margin(
            t = 0, r = 0, b = 0, l = 0, unit = "mm"
        ),
        legend.spacing.y = grid::unit(0, "mm"),
        legend.key = ggplot2::element_blank(),
        legend.key.size = grid::unit(3, "mm"),
        legend.text = ggplot2::element_text(
            family = "Arial",
            size = 5,
            margin = ggplot2::margin(
                t = 0, r = 0, b = 0, l = -1, unit = "mm"
            )
        ),
        legend.position = c(0.7, 0.9),
        legend.justification = c(0, 1),
        plot.title = ggplot2::element_text(
            family = "Arial", size = 6, hjust = 0.5
        ),
        plot.background = ggplot2::element_blank()
    )

List files.

fs::dir_ls(
    path = file.path(
        PROJECT_DIR,
        "qc",
        "tss_enrichment/raw/core_set_merged",
        "cut_site"
    ),
    regexp = "npy$"
)
/Users/jialei/Dropbox/Data/Projects/UTSW/Cardiomyopathy/atac-seq/qc/tss_enrichment/raw/core_set_merged/cut_site/Aligned_sorted_deduped_q10_fresh_hcm_21_tss_flanking_0.npy
/Users/jialei/Dropbox/Data/Projects/UTSW/Cardiomyopathy/atac-seq/qc/tss_enrichment/raw/core_set_merged/cut_site/Aligned_sorted_deduped_q10_fresh_healthy_21_tss_flanking_0.npy
/Users/jialei/Dropbox/Data/Projects/UTSW/Cardiomyopathy/atac-seq/qc/tss_enrichment/raw/core_set_merged/cut_site/Aligned_sorted_deduped_q10_fresh_icm_21_tss_flanking_0.npy
/Users/jialei/Dropbox/Data/Projects/UTSW/Cardiomyopathy/atac-seq/qc/tss_enrichment/raw/core_set_merged/cut_site/Aligned_sorted_deduped_q10_fresh_nicm_21_tss_flanking_0.npy

Inspect data.

fs::dir_ls(
    path = file.path(
        PROJECT_DIR,
        "qc",
        "tss_enrichment/raw/core_set_merged",
        "cut_site"
    ),
    regexp = "npy$"
) |>
    purrr::map(\(x) {
        np$load(file = x) |>
            {
                \(y) {
                    y / mean(c(y[1:100], y[4102:4201]))
                }
            }() |>
            tibble::enframe(name = "position", value = "score") |>
            dplyr::mutate(
                category = x |>
                    basename() |>
                    stringr::str_remove(
                        pattern = "Aligned_sorted_deduped_q10_"
                    ) |>
                    stringr::str_remove(
                        pattern = "_21_tss_flanking_0.npy"
                    )
            )
    }) |>
    dplyr::bind_rows() |>
    dplyr::mutate(
        category = category |> stringr::str_to_title(),
        category = dplyr::case_when(
            category == "Fresh_healthy" ~ "Healthy",
            category == "Fresh_icm" ~ "ICM",
            category == "Fresh_nicm" ~ "NICM",
            category == "Fresh_hcm" ~ "HCM"
        ),
        category = factor(
            category,
            levels = c("Healthy", "ICM", "NICM", "HCM")
        )
    ) |>
    head(n = 12)
# A tibble: 12 × 3
   position     score category
      <int> <dbl[1d]> <fct>   
 1        1     0.648 HCM     
 2        2     0.657 HCM     
 3        3     0.664 HCM     
 4        4     0.678 HCM     
 5        5     0.681 HCM     
 6        6     0.690 HCM     
 7        7     0.699 HCM     
 8        8     0.708 HCM     
 9        9     0.719 HCM     
10       10     0.729 HCM     
11       11     0.744 HCM     
12       12     0.748 HCM     

Mitochondrial percentage

Code
dataset |>
    dplyr::mutate(mt_ratio = num_reads_q10_mt / num_reads_q10) |>
    dplyr::mutate(
        category = factor(
            category,
            levels = c("Healthy", "ICM", "NICM", "HCM") |> rev()
        )
    ) |>
    ggplot2::ggplot(
        ggplot2::aes(
            x = mt_ratio, y = category, fill = category
        )
    ) +
    ggridges::geom_density_ridges(alpha = 0.8, color = NA) +
    ggplot2::scale_x_continuous(
        labels = scales::percent,
    ) +
    ggplot2::scale_fill_manual(
        values = yarrr::piratepal(palette = "google") |>
            as.character() |> rev(),
    ) +
    ggplot2::labs(x = "Mitochondrial read percentage", y = NULL) +
    ggplot2::guides(fill = "none") +
    ggplot2::ggtitle(label = "Mitochondrial percentage") +
    ggplot2::theme_linedraw(base_size = 6, base_family = "Arial") +
    ggplot2::theme(
        legend.background = ggplot2::element_blank(),
        plot.title = ggplot2::element_text(
            family = "Arial", size = 6, hjust = 0.5
        ),
        plot.background = ggplot2::element_blank()
    )

Fragment size distribution

Code
fs::dir_ls(
    path = file.path(
        PROJECT_DIR,
        "qc",
        "fragment_sizes",
        "raw"
    ),
    regexp = "fresh.+_CollectInsertSizeMetrics.txt"
) |>
    purrr::map(\(x) {
        readr::read_delim(
            file = x,
            delim = "\t",
            skip = 11,
            show_col_types = FALSE
        ) |>
            normalize_fragment_sizes(
                category = x |>
                    basename() |>
                    stringr::str_remove(
                        pattern = "_CollectInsertSizeMetrics.txt"
                    ) |>
                    stringr::str_to_title()
            )
    }) |>
    dplyr::bind_rows() |>
    dplyr::mutate(
        category = dplyr::case_when(
            category == "Fresh_healthy" ~ "Healthy",
            category == "Fresh_icm" ~ "ICM",
            category == "Fresh_nicm" ~ "NICM",
            category == "Fresh_hcm" ~ "HCM"
        ),
        category = factor(
            category,
            levels = c(
                "Healthy", "ICM", "NICM", "HCM"
            )
        )
    ) |>
    ggplot2::ggplot(
        ggplot2::aes(
            x = insert_size,
            y = norm_count,
            color = category
        )
    ) +
    ggplot2::geom_line() +
    ggplot2::scale_x_continuous(
        name = "Fragment size (bp)",
        limits = c(0, 1000),
        breaks = seq(0, 1000, 200)
    ) +
    ggplot2::scale_y_continuous(
        name = "Norm. read density",
        labels = scales::math_format(10^.x)
    ) +
    ggplot2::annotation_logticks(base = 10, sides = "l", scaled = TRUE) +
    ggplot2::scale_color_manual(
        name = NULL,
        values = as.character(yarrr::piratepal(palette = "google"))
    ) +
    ggplot2::ggtitle(label = "Fragment size distribution") +
    ggplot2::theme_bw(base_size = 6, base_family = "Arial") +
    ggplot2::theme(
        legend.background = ggplot2::element_blank(),
        legend.margin = ggplot2::margin(
            t = 0, r = 0, b = 0, l = 0, unit = "mm"
        ),
        legend.spacing.y = ggplot2::unit(0, "mm"),
        legend.key = ggplot2::element_blank(),
        legend.key.size = ggplot2::unit(3, "mm"),
        legend.text = ggplot2::element_text(
            family = "Arial",
            size = 5,
            margin = ggplot2::margin(
                t = 0, r = 0, b = 0, l = -1, unit = "mm"
            )
        ),
        legend.position = c(0.7, 0.9),
        legend.justification = c(0, 1),
        legend.box.background = ggplot2::element_blank(),
        panel.background = ggplot2::element_blank(),
        plot.title = ggplot2::element_text(
            family = "Arial", size = 6, hjust = 0.5
        ),
        plot.background = ggplot2::element_blank()
    )

List files.

fs::dir_ls(
    path = file.path(
        PROJECT_DIR,
        "qc",
        "fragment_sizes",
        "raw"
    ),
    regexp = "fresh.+_CollectInsertSizeMetrics.txt"
)
/Users/jialei/Dropbox/Data/Projects/UTSW/Cardiomyopathy/atac-seq/qc/fragment_sizes/raw/fresh_hcm_CollectInsertSizeMetrics.txt
/Users/jialei/Dropbox/Data/Projects/UTSW/Cardiomyopathy/atac-seq/qc/fragment_sizes/raw/fresh_healthy_CollectInsertSizeMetrics.txt
/Users/jialei/Dropbox/Data/Projects/UTSW/Cardiomyopathy/atac-seq/qc/fragment_sizes/raw/fresh_icm_CollectInsertSizeMetrics.txt
/Users/jialei/Dropbox/Data/Projects/UTSW/Cardiomyopathy/atac-seq/qc/fragment_sizes/raw/fresh_nicm_CollectInsertSizeMetrics.txt

Inspect data.

fs::dir_ls(
    path = file.path(
        PROJECT_DIR,
        "qc",
        "fragment_sizes",
        "raw"
    ),
    regexp = "fresh.+_CollectInsertSizeMetrics.txt"
) |>
    purrr::map(\(x) {
        readr::read_delim(
            file = x,
            delim = "\t",
            skip = 11,
            show_col_types = FALSE
        ) |>
            normalize_fragment_sizes(
                category = x |>
                    basename() |>
                    stringr::str_remove(
                        pattern = "_CollectInsertSizeMetrics.txt"
                    ) |>
                    stringr::str_to_title()
            )
    }) |>
    dplyr::bind_rows() |>
    dplyr::mutate(
        category = dplyr::case_when(
            category == "Fresh_healthy" ~ "Healthy",
            category == "Fresh_icm" ~ "ICM",
            category == "Fresh_nicm" ~ "NICM",
            category == "Fresh_hcm" ~ "HCM"
        ),
        category = factor(
            category,
            levels = c(
                "Healthy", "ICM", "NICM", "HCM"
            )
        )
    ) |>
    head(n = 12)
# A tibble: 12 × 6
   insert_size All_Reads.fr_count All_Reads.rf_count all_reads…¹ norm_…² categ…³
         <dbl>              <dbl>              <dbl>       <dbl>   <dbl> <fct>  
 1          20                 59                 62          59   -6.53 HCM    
 2          21                 81                100          81   -6.40 HCM    
 3          22                135                115         135   -6.17 HCM    
 4          23                169                174         169   -6.08 HCM    
 5          24                362                374         362   -5.75 HCM    
 6          25               1357               1427        1357   -5.17 HCM    
 7          26              23899              23859       23899   -3.93 HCM    
 8          27              49856              49877       49856   -3.61 HCM    
 9          28              46698              46688       46698   -3.64 HCM    
10          29              46807              46847       46807   -3.63 HCM    
11          30              42295              42213       42295   -3.68 HCM    
12          31              36400              36158       36400   -3.74 HCM    
# … with abbreviated variable names ¹​all_reads_count, ²​norm_count, ³​category

Chromatin states

fragment_size <- fs::dir_ls(
    path = file.path(
        PROJECT_DIR,
        "qc",
        "fragment_sizes",
        "raw"
    ),
    regexp = "fresh.+_CollectInsertSizeMetrics.txt"
) |>
    purrr::map(\(x) {
        a <- readr::read_delim(
            file = x,
            delim = "\t",
            skip = 11,
            show_col_types = FALSE
        )
        a <- setNames(
            object = a$All_Reads.fr_count,
            nm = a$insert_size
        )
        a
    })

names(fragment_size) <- names(fragment_size) |>
    basename() |>
    stringr::str_remove(
        pattern = "_CollectInsertSizeMetrics.txt"
    )
Code
z <- c("Healthy", "ICM", "NICM", "HCM")

purrr::map2(
    c("fresh_healthy", "fresh_icm", "fresh_nicm", "fresh_hcm"), z, \(x, z) {
        sample_name <- x
        fragment_size_distribution <- fs::dir_ls(
            path = file.path(
                PROJECT_DIR,
                "qc/chromatin_states",
                "raw",
                sample_name
            ),
            regexp = "\\.txt"
        ) |>
            purrr::map(\(y) {
                sample_name <- stringr::str_remove(
                    string = basename(y),
                    pattern = ".+\\.bam_fragments_"
                ) |>
                    str_remove(
                        pattern = ".txt"
                    )

                readr::read_delim(
                    file = file.path(
                        y
                    ),
                    delim = "\t",
                    col_names = c("fragment_size", "count")
                ) |>
                    dplyr::filter(
                        fragment_size >= 50,
                        fragment_size <= 750
                    ) |>
                    dplyr::mutate(
                        category = sample_name
                    ) |>
                    dplyr::select(
                        fragment_size,
                        count,
                        category
                    )
            })

        fragment_size_distribution <- fragment_size_distribution |>
            purrr::map(\(x) {
                x[["percentage"]] <- (
                    x[["count"]] / (
                        fragment_size[[sample_name]]
                    )[x$fragment_size]
                )
                x[["value"]] <- as.vector(scale(x[["percentage"]]))

                x_limits <- quantile(x[["value"]], c(0.1, 0.9))
                x[["value"]][x[["value"]] <= x_limits[1]] <- x_limits[[1]]
                x[["value"]][x[["value"]] >= x_limits[2]] <- x_limits[[2]]
                x
            })

        fragment_size_distribution |>
            dplyr::bind_rows() |>
            dplyr::mutate(
                category = factor(
                    category,
                    levels = c(
                        "CTCF_binding_site",
                        "promoter",
                        "promoter_flanking_region",
                        "enhancer",
                        "TF_binding_site",
                        "open_chromatin_region"
                    ) |> rev()
                )
            ) |>
            ggplot2::ggplot(
                ggplot2::aes(
                    x = fragment_size,
                    y = category,
                    fill = value
                )
            ) +
            ggplot2::geom_tile(ggplot2::aes(fill = value)) +
            ggplot2::scale_fill_gradient2(name = NULL) +
            ggplot2::scale_x_continuous(
                name = "Fragment size (bp)",
                limits = c(50, 750),
                breaks = seq(50, 750, 175)
            ) +
            ggplot2::scale_y_discrete(name = NULL) +
            ggplot2::ggtitle(label = z) +
            ggplot2::theme_linedraw(base_size = 6, base_family = "Arial") +
            ggplot2::theme(
                legend.background = ggplot2::element_blank(),
                legend.margin = ggplot2::margin(
                    t = 0, r = 0, b = 0, l = 0, unit = "mm"
                ),
                legend.key = ggplot2::element_blank(),
                legend.key.height = ggplot2::unit(2, "mm"),
                legend.key.width = ggplot2::unit(2, "mm"),
                legend.text = ggplot2::element_text(
                    family = "Arial",
                    # size = 6,
                    margin = ggplot2::margin(
                        t = 0, r = 0, b = 0, l = -0.5, unit = "mm"
                    )
                ),
                legend.box.margin = ggplot2::margin(
                    t = 0, r = 0, b = 0, l = -1, unit = "mm"
                ),
                legend.box.background = ggplot2::element_blank(),
                #

                plot.title = ggplot2::element_text(
                    family = "Arial", size = 6, hjust = 0.5
                )
            )
    }
) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 1) +
    patchwork::plot_annotation(
        theme = ggplot2::theme(plot.margin = ggplot2::margin())
    )

R session info

devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.2.1 (2022-06-23)
 os       macOS Monterey 12.6
 system   aarch64, darwin21.6.0
 ui       unknown
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/Chicago
 date     2022-09-21
 pandoc   2.19.2 @ /opt/homebrew/bin/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package       * version       date (UTC) lib source
 BayesFactor     0.9.12-4.4    2022-07-05 [1] CRAN (R 4.2.1)
 bit             4.0.4         2020-08-04 [1] CRAN (R 4.2.0)
 bit64           4.0.5         2020-08-30 [1] CRAN (R 4.2.0)
 cachem          1.0.6         2021-08-19 [1] CRAN (R 4.2.0)
 callr           3.7.2         2022-08-22 [1] CRAN (R 4.2.1)
 circlize        0.4.15        2022-05-10 [1] CRAN (R 4.2.0)
 cli             3.4.0         2022-09-08 [1] CRAN (R 4.2.1)
 coda            0.19-4        2020-09-30 [1] CRAN (R 4.2.0)
 colorspace      2.0-3         2022-02-21 [1] CRAN (R 4.2.0)
 crayon          1.5.1         2022-03-26 [1] CRAN (R 4.2.0)
 devtools        2.4.4.9000    2022-08-11 [1] Github (r-lib/devtools@c9696a6)
 digest          0.6.29        2021-12-01 [1] CRAN (R 4.2.0)
 dplyr         * 1.0.99.9000   2022-09-21 [1] Github (tidyverse/dplyr@60f7a2d)
 ellipsis        0.3.2         2021-04-29 [1] CRAN (R 4.2.0)
 evaluate        0.16          2022-08-09 [1] CRAN (R 4.2.1)
 extrafont     * 0.18          2022-04-12 [1] CRAN (R 4.2.0)
 extrafontdb     1.0           2012-06-11 [1] CRAN (R 4.2.0)
 fansi           1.0.3         2022-03-24 [1] CRAN (R 4.2.0)
 farver          2.1.1         2022-07-06 [1] CRAN (R 4.2.1)
 fastmap         1.1.0         2021-01-25 [1] CRAN (R 4.2.0)
 forcats       * 0.5.2.9000    2022-08-20 [1] Github (tidyverse/forcats@bd319e0)
 fs              1.5.2.9000    2022-08-24 [1] Github (r-lib/fs@238032f)
 generics        0.1.3         2022-07-05 [1] CRAN (R 4.2.1)
 ggplot2       * 3.3.6.9000    2022-09-12 [1] Github (tidyverse/ggplot2@a58b48c)
 ggridges        0.5.3         2021-01-08 [1] CRAN (R 4.2.0)
 GlobalOptions   0.1.2         2020-06-10 [1] CRAN (R 4.2.0)
 glue            1.6.2.9000    2022-04-22 [1] Github (tidyverse/glue@d47d6c7)
 gtable          0.3.1.9000    2022-09-01 [1] Github (r-lib/gtable@c1a7a81)
 hms             1.1.2         2022-08-19 [1] CRAN (R 4.2.1)
 htmltools       0.5.3         2022-07-18 [1] CRAN (R 4.2.1)
 htmlwidgets     1.5.4         2022-08-23 [1] Github (ramnathv/htmlwidgets@400cf1a)
 httpuv          1.6.6         2022-09-08 [1] CRAN (R 4.2.1)
 jpeg            0.1-9         2021-07-24 [1] CRAN (R 4.2.0)
 jsonlite        1.8.0         2022-02-22 [1] CRAN (R 4.2.0)
 knitr           1.40          2022-08-24 [1] CRAN (R 4.2.1)
 labeling        0.4.2         2020-10-20 [1] CRAN (R 4.2.0)
 later           1.3.0         2021-08-18 [1] CRAN (R 4.2.0)
 lattice         0.20-45       2021-09-22 [2] CRAN (R 4.2.1)
 lifecycle       1.0.2.9000    2022-09-09 [1] Github (r-lib/lifecycle@a2666fc)
 lubridate     * 1.8.0.9000    2022-05-24 [1] Github (tidyverse/lubridate@0bb49b2)
 magrittr        2.0.3         2022-03-30 [1] CRAN (R 4.2.0)
 Matrix        * 1.5-1         2022-09-13 [1] CRAN (R 4.2.1)
 MatrixModels    0.5-1         2022-09-11 [1] CRAN (R 4.2.1)
 memoise         2.0.1         2021-11-26 [1] CRAN (R 4.2.0)
 mime            0.12          2021-09-28 [1] CRAN (R 4.2.0)
 miniUI          0.1.1.1       2018-05-18 [1] CRAN (R 4.2.0)
 munsell         0.5.0         2018-06-12 [1] CRAN (R 4.2.0)
 mvtnorm         1.1-3         2021-10-08 [1] CRAN (R 4.2.1)
 patchwork     * 1.1.2.9000    2022-08-20 [1] Github (thomasp85/patchwork@c14c960)
 pbapply         1.5-0         2021-09-16 [1] CRAN (R 4.2.0)
 pillar          1.8.1         2022-08-19 [1] CRAN (R 4.2.1)
 pkgbuild        1.3.1         2021-12-20 [1] CRAN (R 4.2.0)
 pkgconfig       2.0.3         2019-09-22 [1] CRAN (R 4.2.0)
 pkgload         1.3.0         2022-06-27 [1] CRAN (R 4.2.1)
 plyr            1.8.7         2022-03-24 [1] CRAN (R 4.2.0)
 png             0.1-7         2013-12-03 [1] CRAN (R 4.2.0)
 prettyunits     1.1.1.9000    2022-04-22 [1] Github (r-lib/prettyunits@8706d89)
 processx        3.7.0         2022-07-07 [1] CRAN (R 4.2.1)
 profvis         0.3.7         2020-11-02 [1] CRAN (R 4.2.0)
 promises        1.2.0.1       2021-02-11 [1] CRAN (R 4.2.0)
 ps              1.7.1         2022-06-18 [1] CRAN (R 4.2.0)
 purrr         * 0.9000.0.9000 2022-09-21 [1] Github (tidyverse/purrr@194b8ef)
 R.cache         0.16.0        2022-07-21 [1] CRAN (R 4.2.1)
 R.methodsS3     1.8.2         2022-06-13 [1] CRAN (R 4.2.0)
 R.oo            1.25.0        2022-06-12 [1] CRAN (R 4.2.0)
 R.utils         2.12.0        2022-06-28 [1] CRAN (R 4.2.1)
 R6              2.5.1.9000    2022-08-04 [1] Github (r-lib/R6@87d5e45)
 ragg            1.2.2.9000    2022-09-12 [1] Github (r-lib/ragg@904e145)
 Rcpp            1.0.9         2022-07-08 [1] CRAN (R 4.2.1)
 readr         * 2.1.2.9000    2022-09-20 [1] Github (tidyverse/readr@5cac6ed)
 remotes         2.4.2         2022-09-12 [1] Github (r-lib/remotes@bc0949d)
 reticulate      1.26          2022-08-31 [1] CRAN (R 4.2.1)
 rlang           1.0.5.9000    2022-09-16 [1] Github (r-lib/rlang@5a25ff4)
 rmarkdown       2.16.1        2022-08-25 [1] Github (rstudio/rmarkdown@b8a9879)
 Rttf2pt1        1.3.10        2022-02-07 [1] CRAN (R 4.2.0)
 scales          1.2.1.9000    2022-08-20 [1] Github (r-lib/scales@b3df2fb)
 sessioninfo     1.2.2         2021-12-06 [1] CRAN (R 4.2.0)
 shape           1.4.6         2021-05-19 [1] CRAN (R 4.2.0)
 shiny           1.7.2         2022-07-19 [1] CRAN (R 4.2.1)
 stringi         1.7.8         2022-07-11 [1] CRAN (R 4.2.1)
 stringr       * 1.4.1.9000    2022-08-21 [1] Github (tidyverse/stringr@792bc92)
 styler        * 1.7.0.9002    2022-09-21 [1] Github (r-lib/styler@1f4437b)
 systemfonts     1.0.4         2022-02-11 [1] CRAN (R 4.2.0)
 textshaping     0.3.6         2021-10-13 [1] CRAN (R 4.2.0)
 tibble        * 3.1.8.9001    2022-09-20 [1] Github (tidyverse/tibble@b740af1)
 tidyr         * 1.2.1.9000    2022-09-09 [1] Github (tidyverse/tidyr@653def2)
 tidyselect      1.1.2.9000    2022-09-21 [1] Github (r-lib/tidyselect@edd0a3b)
 tidyverse     * 1.3.2.9000    2022-09-12 [1] Github (tidyverse/tidyverse@3be8283)
 tzdb            0.3.0         2022-03-28 [1] CRAN (R 4.2.0)
 urlchecker      1.0.1         2021-11-30 [1] CRAN (R 4.2.0)
 usethis         2.1.6.9000    2022-09-15 [1] Github (r-lib/usethis@7c34252)
 utf8            1.2.2         2021-07-24 [1] CRAN (R 4.2.0)
 vctrs           0.4.1.9000    2022-09-19 [1] Github (r-lib/vctrs@0a219ba)
 vroom           1.5.7.9000    2022-09-09 [1] Github (r-lib/vroom@0c2423e)
 withr           2.5.0         2022-03-03 [1] CRAN (R 4.2.0)
 xfun            0.33          2022-09-12 [1] CRAN (R 4.2.1)
 xtable          1.8-4         2019-04-21 [1] CRAN (R 4.2.0)
 yaml            2.3.5         2022-02-21 [1] CRAN (R 4.2.0)
 yarrr           0.1.6         2022-04-22 [1] Github (ndphillips/yarrr@e2e4488)

 [1] /opt/homebrew/lib/R/4.2/site-library
 [2] /opt/homebrew/Cellar/r/4.2.1_4/lib/R/library

─ Python configuration ───────────────────────────────────────────────────────
 python:         /Users/jialei/.pyenv/shims/python
 libpython:      /Users/jialei/.pyenv/versions/mambaforge-4.10.3-10/lib/libpython3.9.dylib
 pythonhome:     /Users/jialei/.pyenv/versions/mambaforge-4.10.3-10:/Users/jialei/.pyenv/versions/mambaforge-4.10.3-10
 version:        3.9.13 | packaged by conda-forge | (main, May 27 2022, 17:00:33)  [Clang 13.0.1 ]
 numpy:          /Users/jialei/.pyenv/versions/mambaforge-4.10.3-10/lib/python3.9/site-packages/numpy
 numpy_version:  1.22.4
 numpy:          /Users/jialei/.pyenv/versions/mambaforge-4.10.3-10/lib/python3.9/site-packages/numpy
 
 NOTE: Python version was forced by RETICULATE_PYTHON

──────────────────────────────────────────────────────────────────────────────